<?php

namespace app\common\library;

use think\Db;
use think\Log;

/**
 * 简单权限管理类
 * 独立的权限系统，不依赖FastAdmin
 */
class SimplePermission
{
    private static $instance = null;
    
    /**
     * 获取单例实例
     */
    public static function instance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * 检查管理员是否有指定API方法的权限
     * @param int $adminId 管理员ID
     * @param string $apiMethod API方法名
     * @return bool
     */
    public function checkPermission($adminId, $apiMethod)
    {
        try {
            // 超级管理员拥有所有权限
            if ($adminId == 1) {
                Log::info("SimplePermission - 超级管理员 {$adminId} 拥有所有权限");
                return true;
            }
            
            // 获取API权限配置
            $apiPermission = Db::name('scanwork_api_permissions')
                ->where('api_method', $apiMethod)
                ->where('is_active', 1)
                ->find();
                
            if (!$apiPermission) {
                Log::warning("SimplePermission - API方法 {$apiMethod} 没有配置权限，默认拒绝");
                return false;
            }
            
            // 检查管理员是否有对应权限
            $hasPermission = Db::name('scanwork_admin_permissions')
                ->where('admin_id', $adminId)
                ->where('module', $apiPermission['module_name'])
                ->where('action', $apiPermission['action_name'])
                ->where('status', 1)
                ->count() > 0;
                
            if ($hasPermission) {
                Log::info("SimplePermission - 权限检查通过: 管理员ID={$adminId}, API方法={$apiMethod}, 模块={$apiPermission['module_name']}, 操作={$apiPermission['action_name']}");
            } else {
                Log::warning("SimplePermission - 权限检查失败: 管理员ID={$adminId}, API方法={$apiMethod}, 模块={$apiPermission['module_name']}, 操作={$apiPermission['action_name']}");
            }
            
            return $hasPermission;
            
        } catch (\Exception $e) {
            Log::error("SimplePermission - 权限检查异常: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 获取管理员的权限列表
     * @param int $adminId 管理员ID
     * @return array
     */
    public function getAdminPermissions($adminId)
    {
        try {
            if ($adminId == 1) {
                // 超级管理员返回所有权限
                $allPermissions = Db::name('scanwork_api_permissions')
                    ->where('is_active', 1)
                    ->select();
                    
                $permissions = [];
                foreach ($allPermissions as $perm) {
                    $permissions[] = $perm['module_name'] . '/' . $perm['action_name'];
                }
                return $permissions;
            }
            
            // 获取管理员的权限
            $permissions = Db::name('scanwork_admin_permissions')
                ->alias('ap')
                ->join('scanwork_api_permissions api', 'ap.module = api.module_name AND ap.action = api.action_name')
                ->where('ap.admin_id', $adminId)
                ->where('ap.status', 1)
                ->where('api.is_active', 1)
                ->column('CONCAT(ap.module, "/", ap.action) as permission');
                
            return array_values($permissions);
            
        } catch (\Exception $e) {
            Log::error("SimplePermission - 获取管理员权限异常: " . $e->getMessage());
            return [];
        }
    }
    
    /**
     * 设置管理员权限
     * @param int $adminId 管理员ID
     * @param string $moduleName 模块名称
     * @param string $actionName 操作名称
     * @param bool $isGranted 是否授权
     * @return bool
     */
    public function setAdminPermission($adminId, $moduleName, $actionName, $isGranted = true)
    {
        try {
            $data = [
                'admin_id' => $adminId,
                'module' => $moduleName,
                'action' => $actionName,
                'status' => $isGranted ? 1 : 0,
                'updatetime' => time()
            ];
            
            // 检查是否已存在
            $exists = Db::name('scanwork_admin_permissions')
                ->where('admin_id', $adminId)
                ->where('module', $moduleName)
                ->where('action', $actionName)
                ->find();
                
            if ($exists) {
                // 更新
                $result = Db::name('scanwork_admin_permissions')
                    ->where('id', $exists['id'])
                    ->update($data);
            } else {
                // 插入
                $data['createtime'] = time();
                $result = Db::name('scanwork_admin_permissions')->insert($data);
            }
            
            Log::info("SimplePermission - 设置管理员权限: 管理员ID={$adminId}, 模块={$moduleName}, 操作={$actionName}, 授权=" . ($isGranted ? '是' : '否'));
            
            return $result !== false;
            
        } catch (\Exception $e) {
            Log::error("SimplePermission - 设置管理员权限异常: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 批量设置管理员权限
     * @param int $adminId 管理员ID
     * @param array $permissions 权限数组 [['module' => 'order_manage', 'action' => 'view', 'granted' => true], ...]
     * @return bool
     */
    public function setAdminPermissions($adminId, $permissions)
    {
        try {
            Log::info("SimplePermission - setAdminPermissions开始: 管理员ID={$adminId}, 权限数据类型=" . gettype($permissions) . ", 权限数据=" . json_encode($permissions));
            
            if (!is_array($permissions)) {
                Log::error("SimplePermission - 权限数据不是数组类型: " . gettype($permissions));
                return false;
            }
            
            Db::startTrans();
            
            // 先删除该管理员的所有权限
            Db::name('scanwork_admin_permissions')
                ->where('admin_id', $adminId)
                ->delete();
            
            // 插入新权限
            foreach ($permissions as $index => $perm) {
                Log::info("SimplePermission - 处理权限项 {$index}: " . json_encode($perm));
                
                if (isset($perm['module']) && isset($perm['action'])) {
                    $data = [
                        'admin_id' => $adminId,
                        'module' => $perm['module'],
                        'action' => $perm['action'],
                        'status' => isset($perm['granted']) && $perm['granted'] ? 1 : 0,
                        'createtime' => time(),
                        'updatetime' => time()
                    ];
                    
                    Log::info("SimplePermission - 准备插入数据: " . json_encode($data));
                    $result = Db::name('scanwork_admin_permissions')->insert($data);
                    Log::info("SimplePermission - 插入结果: " . ($result ? '成功' : '失败'));
                } else {
                    Log::warning("SimplePermission - 权限项缺少必要字段: " . json_encode($perm));
                }
            }
            
            Db::commit();
            Log::info("SimplePermission - 批量设置管理员权限成功: 管理员ID={$adminId}, 权限数量=" . count($permissions));
            
            return true;
            
        } catch (\Exception $e) {
            Db::rollback();
            Log::error("SimplePermission - 批量设置管理员权限异常: " . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 获取所有可用的权限模块和操作
     * @return array
     */
    public function getAllPermissions()
    {
        try {
            $permissions = Db::name('scanwork_api_permissions')
                ->where('is_active', 1)
                ->field('module_name, action_name, description')
                ->select();
                
            $result = [];
            foreach ($permissions as $perm) {
                if (!isset($result[$perm['module_name']])) {
                    $result[$perm['module_name']] = [];
                }
                $result[$perm['module_name']][] = [
                    'action' => $perm['action_name'],
                    'description' => $perm['description']
                ];
            }
            
            return $result;
            
        } catch (\Exception $e) {
            Log::error("SimplePermission - 获取所有权限异常: " . $e->getMessage());
            return [];
        }
    }
}
